package com.sojson.util.threadLocal;

import lombok.extern.slf4j.Slf4j;

/**
 * 自定义线程变量工具类
 * 
 * @author liu
 * @date 2021-08-12
 */
@Slf4j
public class CustomThreadLocalUtil {

    /**
     * 使用ThreadLocal维护变量，ThreadLocal为每个使用该变量的线程提供独立的变量副本，
     * 所以每一个线程都可以独立地改变自己的副本，而不会影响其它线程所对应的副本。
     */
    // private static final ThreadLocal<Object> DATA_SOURCE = new ThreadLocal<>();
    /** SqlSessionFactory */
    private static final CustomThreadLocal<Object> DATA_SOURCE_TYPE = new CustomThreadLocal<>();
    /** 数据源 */
    private static final CustomThreadLocal<Object> DATA_SOURCE = new CustomThreadLocal<>();

    /**
     * 设置数据源类型的变量
     */
    public static void setDataSourceType(Object val) {
        log.info("切换到{}SqlSessionFactory", val);
        DATA_SOURCE_TYPE.set(val);
        DATA_SOURCE.remove();
    }

    /**
     * 获得数据源类型的变量
     */
    public static Object getDataSourceType() {
        return DATA_SOURCE_TYPE.get();
    }

    /**
     * 清空数据源类型变量
     */
    public static void clearDataSourceType() {
        DATA_SOURCE_TYPE.remove();
        DATA_SOURCE.remove();
    }

    /**
     * 设置数据源的变量
     */
    public static void setDataSource(Object dsType) {
        log.info("切换到{}数据源", dsType);
        DATA_SOURCE.set(dsType);
    }

    /**
     * 获得数据源的变量
     */
    public static Object getDataSource() {
        return DATA_SOURCE.get();
    }

    /**
     * 清空数据源变量
     */
    public static void clearDataSource() {
        DATA_SOURCE.remove();
    }

}